import java.util.*;
import java.util.regex.Pattern;

public class TextClassifier {
    private Map<String, Set<String>> categoryKeywords;
    private Map<String, Pattern> categoryPatterns;

    public TextClassifier() {
        initializeKeywords();
        initializePatterns();
    }

    private void initializeKeywords() {
        categoryKeywords = new HashMap<>();

        // 工作文档
        categoryKeywords.put("工作文档", new HashSet<>(Arrays.asList(
                "会议", "报告", "计划", "总结", "方案", "项目", "任务", "工作", "公司", "部门",
                "汇报", "分析", "业务", "流程", "目标", "成果", "绩效", "团队", "管理", "执行")));

        // 学习笔记
        categoryKeywords.put("学习笔记", new HashSet<>(Arrays.asList(
                "笔记", "学习", "知识", "概念", "理论", "方法", "技巧", "要点", "重点", "难点",
                "复习", "考试", "课程", "教程", "练习", "作业", "思考", "理解", "掌握", "应用")));

        // 日记日志
        categoryKeywords.put("日记日志", new HashSet<>(Arrays.asList(
                "今天", "昨天", "明天", "日记", "记录", "心情", "感受", "想法", "生活", "日常",
                "早上", "中午", "晚上", "睡觉", "起床", "吃饭", "散步", "购物", "朋友", "家人")));

        // 技术文档
        categoryKeywords.put("技术文档", new HashSet<>(Arrays.asList(
                "代码", "程序", "算法", "数据", "系统", "软件", "开发", "编程", "技术", "架构",
                "API", "接口", "数据库", "服务器", "网络", "安全", "测试", "部署", "维护", "优化")));

        // 创意写作
        categoryKeywords.put("创意写作", new HashSet<>(Arrays.asList(
                "故事", "小说", "诗歌", "散文", "创作", "想象", "情节", "角色", "对话", "描述",
                "文学", "艺术", "灵感", "创意", "表达", "情感", "美丽", "浪漫", "梦想", "幻想")));

        // 计划安排
        categoryKeywords.put("计划安排", new HashSet<>(Arrays.asList(
                "计划", "安排", "日程", "时间", "预定", "约定", "会面", "活动", "事件", "行程",
                "准备", "筹备", "组织", "协调", "时间表", "日历", "提醒", "待办", "清单", "目标")));
    }

    private void initializePatterns() {
        categoryPatterns = new HashMap<>();

        // 日期时间模式
        categoryPatterns.put("日记日志", Pattern.compile(
                "\\d{4}[年-]\\d{1,2}[月-]\\d{1,2}[日]?|\\d{1,2}[月-]\\d{1,2}[日]|今天|昨天|明天"));

        // 代码模式
        categoryPatterns.put("技术文档", Pattern.compile(
                "\\{.*\\}|\\[.*\\]|\\(.*\\)|function|class|var|int|String|public|private|return|if|for|while"));

        // 列表模式
        categoryPatterns.put("计划安排", Pattern.compile(
                "^\\s*[1-9]\\d*[.、]|^\\s*[-*+]\\s|^\\s*\\d+\\s*[.)]"));
    }

    public String classify(String text) {
        if (text == null || text.trim().isEmpty()) {
            return "未分类";
        }

        text = text.toLowerCase();
        Map<String, Integer> categoryScores = new HashMap<>();

        // 基于关键词的分类评分
        for (Map.Entry<String, Set<String>> entry : categoryKeywords.entrySet()) {
            String category = entry.getKey();
            Set<String> keywords = entry.getValue();
            int score = 0;

            for (String keyword : keywords) {
                if (text.contains(keyword)) {
                    score += 1;
                    // 如果关键词在文本开头，给予额外权重
                    if (text.startsWith(keyword)) {
                        score += 2;
                    }
                }
            }

            categoryScores.put(category, score);
        }

        // 基于模式的分类评分
        for (Map.Entry<String, Pattern> entry : categoryPatterns.entrySet()) {
            String category = entry.getKey();
            Pattern pattern = entry.getValue();

            if (pattern.matcher(text).find()) {
                categoryScores.put(category, categoryScores.getOrDefault(category, 0) + 3);
            }
        }

        // 基于文本特征的额外判断
        addFeatureBasedScores(text, categoryScores);

        // 找到得分最高的分类
        String bestCategory = "未分类";
        int maxScore = 0;

        for (Map.Entry<String, Integer> entry : categoryScores.entrySet()) {
            if (entry.getValue() > maxScore) {
                maxScore = entry.getValue();
                bestCategory = entry.getKey();
            }
        }

        // 如果最高分太低，返回未分类
        if (maxScore < 2) {
            return "未分类";
        }

        return bestCategory;
    }

    private void addFeatureBasedScores(String text, Map<String, Integer> scores) {
        // 文本长度特征
        int textLength = text.length();

        // 短文本更可能是日记或笔记
        if (textLength < 200) {
            scores.put("日记日志", scores.getOrDefault("日记日志", 0) + 1);
        }

        // 长文本更可能是工作文档或技术文档
        if (textLength > 1000) {
            scores.put("工作文档", scores.getOrDefault("工作文档", 0) + 1);
            scores.put("技术文档", scores.getOrDefault("技术文档", 0) + 1);
        }

        // 问号多的文本可能是学习笔记
        long questionCount = text.chars().filter(ch -> ch == '？' || ch == '?').count();
        if (questionCount > 2) {
            scores.put("学习笔记", scores.getOrDefault("学习笔记", 0) + 2);
        }

        // 包含很多数字的文本可能是计划或技术文档
        long digitCount = text.chars().filter(Character::isDigit).count();
        if (digitCount > 10) {
            scores.put("计划安排", scores.getOrDefault("计划安排", 0) + 1);
            scores.put("技术文档", scores.getOrDefault("技术文档", 0) + 1);
        }

        // 包含很多引号的文本可能是创意写作
        long quoteCount = text.chars().filter(ch -> ch == '"' || ch == '\'' || ch == '（' || ch == '）').count();
        if (quoteCount > 4) {
            scores.put("创意写作", scores.getOrDefault("创意写作", 0) + 2);
        }
    }

    // 获取所有支持的分类
    public Set<String> getSupportedCategories() {
        return new HashSet<>(categoryKeywords.keySet());
    }

    // 获取分类的详细信息
    public String getCategoryDescription(String category) {
        switch (category) {
            case "工作文档":
                return "包含工作相关内容，如会议记录、项目报告、工作计划等";
            case "学习笔记":
                return "学习相关的记录，包括课程笔记、知识总结、学习心得等";
            case "日记日志":
                return "个人日常记录，包括生活感悟、心情记录、日常事件等";
            case "技术文档":
                return "技术相关内容，包括代码、算法、系统设计、技术方案等";
            case "创意写作":
                return "创作类文本，包括故事、诗歌、散文、创意表达等";
            case "计划安排":
                return "计划和安排类内容，包括日程、待办事项、目标规划等";
            default:
                return "未能识别的文本类型";
        }
    }
}